/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.29
 */

import type { LogLevel } from '../declarations';

/** 日志等级映射 */
const LogLevelMap: Record<LogLevel, number> = {
    trace: 0,
    debug: 1,
    info: 2,
    warn: 3,
    error: 4,
};

/**
 * - 作者: DoooReyn
 * - 日期: 2023.10.29
 * - 名称: Provider
 * - 描述: 日志提供商
 */
export class Provider {
    /** 日志类别 */
    private __catalog: string;

    /** 日志开关状态 */
    private __status: boolean;

    /** 日志等级 */
    private __level: LogLevel = 'debug';

    /**
     * 构造
     * @param catalog 日志类别
     * @param status 日志开关状态
     */
    public constructor(catalog: string, status: boolean = true) {
        this.__status = status;
        this.__catalog = catalog;
    }

    /** 日志等级 */
    public get level() {
        return this.__level;
    }

    /** 设置日志等级 */
    public set level(level: LogLevel) {
        this.__level = level;
    }

    /** 是否可用 */
    public get enabled() {
        return this.__status;
    }

    /** 设置是否可用 */
    public set enabled(on: boolean) {
        this.__status = on;
    }

    /** 输出日志 */
    private print(level: LogLevel, ...args: any[]) {
        if (this.enabled && LogLevelMap[level] >= LogLevelMap[this.level])
            console[level].call(console, `[${level[0].toUpperCase()}] <${this.__catalog}>`, ...args);
    }

    /** 记录跟踪 */
    public trace = this.print.bind(this, 'trace');

    /** 记录调试 */
    public debug = this.print.bind(this, 'debug');

    /** 记录信息 */
    public info = this.print.bind(this, 'info');

    /** 记录警告 */
    public warn = this.print.bind(this, 'warn');

    /** 记录错误 */
    public error = this.print.bind(this, 'error');
}
